/**
 * 连接池管理器模块
 * @author HalRui
 * @version 1.0.0
 * @description 统一管理 Redis 和 MongoDB 连接池，提供数据库连接的初始化、管理和关闭功能
 * @date 2025年9月27日
 */

/**
 * 连接池管理器
 * 统一管理 Redis 和 MongoDB 连接
 * 现在使用独立的 RedisPool 和 MongoPool 类
 */

const RedisPool = require('./redis-pool');
const MongoPool = require('./mongo-pool');
const config = require('../env.config.json');

class ConnectionPool {
    constructor() {
        this.redisPool = new RedisPool();
        this.mongoPool = new MongoPool();
    }

    /**
     * 初始化所有连接
     */
    async init() {
        try {
            console.log('🚀 正在初始化数据库连接池...');
            
            // 初始化 MongoDB 连接
            await this.mongoPool.connectMongoDB();
            
            // 初始化 Redis 连接
            await this.redisPool.connectRedis();
            
            console.log('✅ 数据库连接池初始化完成');
        } catch (error) {
            console.error('❌ 数据库连接池初始化失败:', error);
            throw error;
        }
    }

    /**
     * 连接 Redis（使用连接池）
     * 现在委托给独立的 RedisPool 类处理
     */
    async connectRedis() {
        return await this.redisPool.connectRedis();
    }

    /**
     * 连接 MongoDB（使用连接池）
     * 现在委托给独立的 MongoPool 类处理
     */
    async connectMongoDB() {
        return await this.mongoPool.connectMongoDB();
    }

    /**
     * 获取 Redis 客户端
     * 委托给独立的 RedisPool 类处理
     */
    getRedisClient() {
        return this.redisPool.getRedisClient();
    }

    /**
     * 获取 MongoDB 连接
     * 委托给独立的 MongoPool 类处理
     */
    getMongoConnection() {
        return this.mongoPool.getMongoConnection();
    }

    /**
     * 检查连接状态
     * 从独立的连接池获取状态信息
     */
    getConnectionStatus() {
        return {
            redis: {
                connected: this.redisPool.isRedisConnected,
                client: this.redisPool.redisClient ? '已初始化' : '未初始化'
            },
            mongodb: {
                connected: this.mongoPool.isMongoConnected,
                connection: this.mongoPool.mongoConnection ? '已初始化' : '未初始化'
            }
        };
    }

    /**
     * 关闭所有连接
     * 委托给独立的连接池处理
     */
    async close() {
        try {
            console.log('🔄 正在关闭数据库连接...');
            
            // 关闭 MongoDB 连接
            await this.mongoPool.disconnect();
            
            // 关闭 Redis 连接
            await this.redisPool.disconnect();
            
            console.log('✅ 所有数据库连接已关闭');
        } catch (error) {
            console.error('❌ 关闭数据库连接失败:', error);
            throw error;
        }
    }

    /**
     * 健康检查
     * 委托给独立的连接池处理
     */
    async healthCheck() {
        const [redisHealth, mongoHealth] = await Promise.all([
            this.redisPool.healthCheck(),
            this.mongoPool.healthCheck()
        ]);

        return {
            timestamp: new Date().toISOString(),
            redis: redisHealth,
            mongodb: mongoHealth
        };
    }
}

// 创建单例实例
const connectionPool = new ConnectionPool();

module.exports = connectionPool;